﻿// Convenient Location Aizu - 0189.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
//https://vjudge.csgrandeur.cn/problem/Aizu-0189


/*
便利的城市
将于明年春天毕业的 A 先生决定在开始工作后搬家。 她所在的公司在几个城镇都有办事处，她每天都要去不同的办事处上班。 
因此，A 先生决定住在去任何一个办公室都不需要花太多时间的小镇上。

因此，您决定帮助 A 先生找到最方便居住的城镇。

城镇的编号从 0 开始，城镇之间有道路相连。 每条道路都有一个通勤时间：假设 A 先生住在一个小镇，他到本镇办公室的通勤时间为 0。 
然后考虑所有城镇的通勤时间总和。 例如，如果城镇和道路的布局如上图所示，A 先生住在城镇 1，那么到每个城镇的通勤时间为

80 到 0 镇
0 到城镇 1
20 到城镇 2
70 到城镇 3
到第 4 镇 90
总和为 260。

创建一个程序，将道路数量和所有道路的信息作为输入，计算如果你住在每个城镇的通勤时间总和，并输出通勤时间最小的城镇的编号和当时的通勤时间总和。 
但是，如果通勤时间总和最小的城镇不止一个，则输出最小城镇的编号和当时的通勤时间总和。 
城镇总数不应超过 10 个，道路总数不应超过 45 条，所有道路都应是双向的，通勤时间不应随方向而变化。 
此外，还假定任何城镇都有一条通往所有其他城镇的路线。

输入
输入是一连串的多个数据集。 输入的结束用一个零表示。每个数据集的格式如下

n
a1 b1 c1
a2 b2 c2
:
an bn cn
第一行给出道路数量 n（1 ≤ n ≤ 45）。 下面 n 行给出第 i 条道路的信息。
ai, bi（0 ≤ ai, bi ≤ 9）是第 i 条道路所连接的城镇编号，ci（0 ≤ ci ≤ 100）是该道路的通勤时间。

输出。
对于每个数据集，总通勤时间最少的城镇的编号和当时的总通勤时间将输出在一行中，中间用空格隔开。

输入样本
6
0 1 80
1 2 20
0 2 60
2 3 50
3 4 60
1 4 90
2
0 1 1
1 2 1
0
样本输入的输出
2 240
1 2
*/

const int N = 50;
int n;
int gra[N][N];
int maxid;

void floyd() {
	for (int k = 0; k <= maxid; k++)
		for (int i = 0; i <= maxid; i++)
			for (int j = 0; j <= maxid; j++)
				gra[i][j] = min(gra[i][j], gra[i][k] + gra[k][j]);
}

int main()
{
	while (cin >> n) {
		if (0 == n) break;
		maxid = -1;
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++)
				if (i == j) gra[i][j] = 0;
				else gra[i][j] = 0x3f3f3f3f;

		for (int i = 0; i < n; i++) {
			int a, b, w;
			cin >> a >> b >> w;
			gra[a][b] = min(gra[a][b],w);
			gra[b][a] = min(gra[b][a],w);
			maxid = max(maxid, max(a, b));
		}

		floyd();

		int ans = 0x3f3f3f3f; int ansid = -1;
		for (int i = 0; i <= maxid ; i++) {
			int sum = 0;
			for (int j = 0; j <= maxid; j++) {
				sum += gra[i][j];
			}
			if (ans > sum) {
				ans = sum; ansid = i;
			}
		}

		cout << ansid << " " << ans << endl;
	}


	return 0;
}

 